Revert "[llvm-debuginfo-analyzer] Add support for LLVM IR format. (#135440)" - #199890
Conversation
…vm#135440)" This reverts commit 6bbbf74. There are link issues with some builbots.
|
@llvm/pr-subscribers-debuginfo Author: Carlos Alberto Enciso (CarlosAlbertoEnciso) ChangesThis reverts commit 6bbbf74. There are link issues with some buildbots. Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff 41 Files Affected:
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
DESCRIPTION
-----------
:program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
The **logical view** abstracts the complexity associated with the
different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
-----------------------------
Total 71 8
-LLVM IR (textual / bitcode representation) SUPPORT
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The below example is used to show the IR output generated by
-:program:`llvm-debuginfo-analyzer`. We compiled the example for a
-IR 64-bit target with Clang (-O0 -g --target=x86_64-linux):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
- 1 using INTPTR = const int *;
- 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) {
- 3 if (ParamBool) {
- 4 typedef int INTEGER;
- 5 const INTEGER CONSTANT = 7;
- 6 return CONSTANT;
- 7 }
- 8 return ParamUnsigned;
- 9 }
+.. code-block:: none
-PRINT BASIC DETAILS
-^^^^^^^^^^^^^^^^^^^
-The following command prints basic details for all the logical elements
-sorted by the debug information internal offset; it includes its lexical
-level and debug info format.
+ llvm-debuginfo-analyzer --attribute=level
+ --select-regex --select-nocase --select=INTe
+ --report=list
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [003] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+ Logical View:
+ [000] {File} 'test-dwarf-gcc.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=scopes,symbols,types,lines,instructions
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=view
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
-or
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ [002] 2 {Function} extern not_inlined 'foo' -> 'int'
+ [003] {Block}
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [003] 2 {Parameter} 'ParamBool' -> 'bool'
+ [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
+ [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=elements
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-clang.o test-dwarf-gcc.o
-Each row represents an element that is present within the debug
-information. The first column represents the scope level, followed by
-the associated line number (if any), and finally the description of
-the element.
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ (1) Missing Types:
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+Changing the *Reference* and *Target* order:
.. code-block:: none
- Logical View:
- [000] {File} 'test-clang.ll' -> Textual IR
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-dwarf-gcc.o test-clang.o
- [001] {CompileUnit} 'test.cpp'
- [002] 2 {Function} extern not_inlined 'foo' -> 'int'
- [003] {Block}
- [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
- [004] 5 {Line}
- [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
- [004] 6 {Line}
- [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
- [004] 6 {Line}
- [004] {Code} 'br label %return, !dbg !33'
- [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
- [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
- [003] 2 {Parameter} 'ParamBool' -> 'bool'
- [003] 4 {TypeAlias} 'INTEGER' -> 'int'
- [003] 2 {Line}
- [003] {Code} '%retval = alloca i32, align 4'
- [003] {Code} '%ParamPtr.addr = alloca ptr, align 8'
- [003] {Code} '%ParamUnsigned.addr = alloca i32, align 4'
- [003] {Code} '%ParamBool.addr = alloca i8, align 1'
- [003] {Code} '%CONSTANT = alloca i32, align 4'
- [003] {Code} 'store ptr %ParamPtr, ptr %ParamPtr.addr, align 8'
- [003] {Code} 'store i32 %ParamUnsigned, ptr %ParamUnsigned.addr, align 4'
- [003] {Code} '%storedv = zext i1 %ParamBool to i8'
- [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
- [003] 8 {Line}
- [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
- [003] 8 {Line}
- [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
- [003] 8 {Line}
- [003] {Code} 'br label %return, !dbg !35'
- [003] 9 {Line}
- [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
- [003] 9 {Line}
- [003] {Code} 'ret i32 %2, !dbg !36'
- [003] 3 {Line}
- [003] 3 {Line}
- [003] 3 {Line}
- [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
- [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ Reference: 'test-dwarf-gcc.o'
+ Target: 'test-clang.o'
+
+ (1) Missing Types:
+ -[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
EXIT STATUS
-----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
// Report the current element as missing or added during comparison.
virtual void report(LVComparePass Pass) {}
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
static LVElementDispatch &getDispatch() { return Dispatch; }
};
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
void print(raw_ostream &OS, bool Full = true) const override;
void printExtra(raw_ostream &OS, bool Full = true) const override;
-
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
};
class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
virtual Error printMatchedElements(bool UseMatchedElements);
virtual void sortScopes() {}
- void printCollectedElements(LVScope *Root);
- bool checkIntegrityScopesTree(LVScope *Root);
-
public:
LVReader() = delete;
LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
#define KIND_3(ENUM, FIELD, F1, F2, F3) \
BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
- return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
- std::string String;
- raw_string_ostream Stream(String);
- Stream << decValue(Value, Width);
- return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
bool Upper = false) {
return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
#include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
using LVReaders = std::vector<std::unique_ptr<LVReader>>;
using ArgVector = std::vector<std::string>;
-using InputHandle =
- PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
- MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
// This class performs the following tasks:
// - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
object::Binary &Binary);
Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
StringRef ExePath);
- Error handleObject(LVReaders &Readers, StringRef Filename,
- MemoryBufferRef Buffer);
- Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+ Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
StringRef FileFormatName, StringRef ExePath = {});
public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/ObjectFile.h"
namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
- PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
- // Used by the metadata 'dump' functions, so the metadata nodes will be
- // numbered canonically; otherwise, pointer addresses are substituted.
- Module *TheModule = nullptr;
-
- // Symbols with locations for current compile unit.
- LVSymbols SymbolsWithLocations;
-
- const DICompileUnit *CUNode = nullptr;
-
- // The Dwarf version (from the module flags).
- unsigned DwarfVersion = 0;
-
- // Location index for global variables.
- uint64_t PoolAddressIndex = 0;
-
- // Default lower bound for arrays.
- int64_t DefaultLowerBound = 0;
-
- // Whether to emit all linkage names, or just abstract subprograms.
- bool UseAllLinkageNames = true;
-
- SSAValueNameMap ValueNameMap;
- DenseMap<void *, uint64_t> InstrLineAddrMap;
- std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
- // Record the last assigned file index for each compile unit.
- // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
- using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
- LVIndexFiles IndexFiles;
-
- // Store a FileID number for each DIFile seen.
- using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
- LVCompileUnitFiles CompileUnitFiles;
-
- // Associate the metadata objects to logical elements.
- using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
- LVMDObjects MDObjects;
-
- // An anonymous type for index type.
- LVType *NodeIndexType = nullptr;
-
- // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
- // difference is setting the 'DICompileUnit::splitDebugFilename' to the
- // name of the split filename: "xxx.dwo".
- bool includeMinimalInlineScopes() const;
- bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
- int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
- void setDefaultLowerBound(LVSourceLanguage *SL);
-
- // We assume a constant instruction-size increase between instructions.
- static constexpr unsigned OFFSET_INCREASE = 4;
- void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
- void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
- auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
- if (!Inserted)
- Iter->second = FileIndex;
- }
-
- // Get the current assigned index file for the given compile unit.
- size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
- LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
- return Iter != IndexFiles.end() ? Iter->second : 0;
- }
-
- // For the given 'DIFile', generate a 1-based index to indicate the
- // source file where the logical element is declared.
- // The IR reader expects the indexes to be 1-based.
- // Each compile unit, keeps track of the last assigned index.
- size_t getOrCreateSourceID(const DIFile *File);
-
- void addMD(const MDNode *MD, LVElement *Element) {
- MDObjects.try_emplace(MD, Element);
- }
- LVElement *getElementForSeenMD(const MDNode *MD) const {
- LVMDObjects::const_iterator Iter = MDObjects.find(MD);
- return Iter != MDObjects.end() ? Iter->second : nullptr;
- }
- LVScope *getScopeForSeenMD(const MDNode *MD) const {
- return static_cast<LVScope *>(getElementForSeenMD(MD));
- }
- LVSymbol *getSymbo...
[truncated]
|
|
@llvm/pr-subscribers-llvm-transforms Author: Carlos Alberto Enciso (CarlosAlbertoEnciso) ChangesThis reverts commit 6bbbf74. There are link issues with some buildbots. Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff 41 Files Affected:
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
DESCRIPTION
-----------
:program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
The **logical view** abstracts the complexity associated with the
different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
-----------------------------
Total 71 8
-LLVM IR (textual / bitcode representation) SUPPORT
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The below example is used to show the IR output generated by
-:program:`llvm-debuginfo-analyzer`. We compiled the example for a
-IR 64-bit target with Clang (-O0 -g --target=x86_64-linux):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
- 1 using INTPTR = const int *;
- 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) {
- 3 if (ParamBool) {
- 4 typedef int INTEGER;
- 5 const INTEGER CONSTANT = 7;
- 6 return CONSTANT;
- 7 }
- 8 return ParamUnsigned;
- 9 }
+.. code-block:: none
-PRINT BASIC DETAILS
-^^^^^^^^^^^^^^^^^^^
-The following command prints basic details for all the logical elements
-sorted by the debug information internal offset; it includes its lexical
-level and debug info format.
+ llvm-debuginfo-analyzer --attribute=level
+ --select-regex --select-nocase --select=INTe
+ --report=list
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [003] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+ Logical View:
+ [000] {File} 'test-dwarf-gcc.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=scopes,symbols,types,lines,instructions
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=view
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
-or
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ [002] 2 {Function} extern not_inlined 'foo' -> 'int'
+ [003] {Block}
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [003] 2 {Parameter} 'ParamBool' -> 'bool'
+ [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
+ [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=elements
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-clang.o test-dwarf-gcc.o
-Each row represents an element that is present within the debug
-information. The first column represents the scope level, followed by
-the associated line number (if any), and finally the description of
-the element.
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ (1) Missing Types:
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+Changing the *Reference* and *Target* order:
.. code-block:: none
- Logical View:
- [000] {File} 'test-clang.ll' -> Textual IR
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-dwarf-gcc.o test-clang.o
- [001] {CompileUnit} 'test.cpp'
- [002] 2 {Function} extern not_inlined 'foo' -> 'int'
- [003] {Block}
- [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
- [004] 5 {Line}
- [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
- [004] 6 {Line}
- [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
- [004] 6 {Line}
- [004] {Code} 'br label %return, !dbg !33'
- [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
- [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
- [003] 2 {Parameter} 'ParamBool' -> 'bool'
- [003] 4 {TypeAlias} 'INTEGER' -> 'int'
- [003] 2 {Line}
- [003] {Code} '%retval = alloca i32, align 4'
- [003] {Code} '%ParamPtr.addr = alloca ptr, align 8'
- [003] {Code} '%ParamUnsigned.addr = alloca i32, align 4'
- [003] {Code} '%ParamBool.addr = alloca i8, align 1'
- [003] {Code} '%CONSTANT = alloca i32, align 4'
- [003] {Code} 'store ptr %ParamPtr, ptr %ParamPtr.addr, align 8'
- [003] {Code} 'store i32 %ParamUnsigned, ptr %ParamUnsigned.addr, align 4'
- [003] {Code} '%storedv = zext i1 %ParamBool to i8'
- [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
- [003] 8 {Line}
- [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
- [003] 8 {Line}
- [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
- [003] 8 {Line}
- [003] {Code} 'br label %return, !dbg !35'
- [003] 9 {Line}
- [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
- [003] 9 {Line}
- [003] {Code} 'ret i32 %2, !dbg !36'
- [003] 3 {Line}
- [003] 3 {Line}
- [003] 3 {Line}
- [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
- [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ Reference: 'test-dwarf-gcc.o'
+ Target: 'test-clang.o'
+
+ (1) Missing Types:
+ -[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
EXIT STATUS
-----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
// Report the current element as missing or added during comparison.
virtual void report(LVComparePass Pass) {}
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
static LVElementDispatch &getDispatch() { return Dispatch; }
};
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
void print(raw_ostream &OS, bool Full = true) const override;
void printExtra(raw_ostream &OS, bool Full = true) const override;
-
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
};
class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
virtual Error printMatchedElements(bool UseMatchedElements);
virtual void sortScopes() {}
- void printCollectedElements(LVScope *Root);
- bool checkIntegrityScopesTree(LVScope *Root);
-
public:
LVReader() = delete;
LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
#define KIND_3(ENUM, FIELD, F1, F2, F3) \
BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
- return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
- std::string String;
- raw_string_ostream Stream(String);
- Stream << decValue(Value, Width);
- return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
bool Upper = false) {
return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
#include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
using LVReaders = std::vector<std::unique_ptr<LVReader>>;
using ArgVector = std::vector<std::string>;
-using InputHandle =
- PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
- MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
// This class performs the following tasks:
// - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
object::Binary &Binary);
Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
StringRef ExePath);
- Error handleObject(LVReaders &Readers, StringRef Filename,
- MemoryBufferRef Buffer);
- Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+ Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
StringRef FileFormatName, StringRef ExePath = {});
public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/ObjectFile.h"
namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
- PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
- // Used by the metadata 'dump' functions, so the metadata nodes will be
- // numbered canonically; otherwise, pointer addresses are substituted.
- Module *TheModule = nullptr;
-
- // Symbols with locations for current compile unit.
- LVSymbols SymbolsWithLocations;
-
- const DICompileUnit *CUNode = nullptr;
-
- // The Dwarf version (from the module flags).
- unsigned DwarfVersion = 0;
-
- // Location index for global variables.
- uint64_t PoolAddressIndex = 0;
-
- // Default lower bound for arrays.
- int64_t DefaultLowerBound = 0;
-
- // Whether to emit all linkage names, or just abstract subprograms.
- bool UseAllLinkageNames = true;
-
- SSAValueNameMap ValueNameMap;
- DenseMap<void *, uint64_t> InstrLineAddrMap;
- std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
- // Record the last assigned file index for each compile unit.
- // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
- using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
- LVIndexFiles IndexFiles;
-
- // Store a FileID number for each DIFile seen.
- using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
- LVCompileUnitFiles CompileUnitFiles;
-
- // Associate the metadata objects to logical elements.
- using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
- LVMDObjects MDObjects;
-
- // An anonymous type for index type.
- LVType *NodeIndexType = nullptr;
-
- // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
- // difference is setting the 'DICompileUnit::splitDebugFilename' to the
- // name of the split filename: "xxx.dwo".
- bool includeMinimalInlineScopes() const;
- bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
- int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
- void setDefaultLowerBound(LVSourceLanguage *SL);
-
- // We assume a constant instruction-size increase between instructions.
- static constexpr unsigned OFFSET_INCREASE = 4;
- void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
- void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
- auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
- if (!Inserted)
- Iter->second = FileIndex;
- }
-
- // Get the current assigned index file for the given compile unit.
- size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
- LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
- return Iter != IndexFiles.end() ? Iter->second : 0;
- }
-
- // For the given 'DIFile', generate a 1-based index to indicate the
- // source file where the logical element is declared.
- // The IR reader expects the indexes to be 1-based.
- // Each compile unit, keeps track of the last assigned index.
- size_t getOrCreateSourceID(const DIFile *File);
-
- void addMD(const MDNode *MD, LVElement *Element) {
- MDObjects.try_emplace(MD, Element);
- }
- LVElement *getElementForSeenMD(const MDNode *MD) const {
- LVMDObjects::const_iterator Iter = MDObjects.find(MD);
- return Iter != MDObjects.end() ? Iter->second : nullptr;
- }
- LVScope *getScopeForSeenMD(const MDNode *MD) const {
- return static_cast<LVScope *>(getElementForSeenMD(MD));
- }
- LVSymbol *getSymbo...
[truncated]
|
|
@llvm/pr-subscribers-llvm-binary-utilities Author: Carlos Alberto Enciso (CarlosAlbertoEnciso) ChangesThis reverts commit 6bbbf74. There are link issues with some buildbots. Patch is 239.22 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/199890.diff 41 Files Affected:
diff --git a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
index 221732775e74c..6fcf8423e8125 100644
--- a/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
+++ b/llvm/docs/CommandGuide/llvm-debuginfo-analyzer.rst
@@ -13,11 +13,10 @@ SYNOPSIS
DESCRIPTION
-----------
:program:`llvm-debuginfo-analyzer` parses debug and text sections in
-binary object files or LLVM IR textual / bitcode representation and prints
-their contents in a logical view, which is a human readable representation
-that closely matches the structure of the original user source code.
-Supported object file formats include ELF, Mach-O, WebAssembly, PDB,
-COFF and IR (textual representation and bitcode).
+binary object files and prints their contents in a logical view, which
+is a human-readable representation that closely matches the structure
+of the original user source code. Supported object file formats include
+ELF, Mach-O, WebAssembly, PDB and COFF.
The **logical view** abstracts the complexity associated with the
different low-level representations of the debugging information that
@@ -2132,95 +2131,143 @@ layout and given the number of matches.
-----------------------------
Total 71 8
-LLVM IR (textual / bitcode representation) SUPPORT
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-The below example is used to show the IR output generated by
-:program:`llvm-debuginfo-analyzer`. We compiled the example for a
-IR 64-bit target with Clang (-O0 -g --target=x86_64-linux):
+COMPARISON MODE
+^^^^^^^^^^^^^^^
+Given the previous example we found the above debug information issue
+(related to the previous invalid scope location for the **'typedef int
+INTEGER'**) by comparing against another compiler.
-.. code-block:: c++
+Using GCC to generate test-dwarf-gcc.o, we can apply a selection pattern
+with the printing mode to obtain the following logical view output.
- 1 using INTPTR = const int *;
- 2 int foo(INTPTR ParamPtr, unsigned ParamUnsigned, bool ParamBool) {
- 3 if (ParamBool) {
- 4 typedef int INTEGER;
- 5 const INTEGER CONSTANT = 7;
- 6 return CONSTANT;
- 7 }
- 8 return ParamUnsigned;
- 9 }
+.. code-block:: none
-PRINT BASIC DETAILS
-^^^^^^^^^^^^^^^^^^^
-The following command prints basic details for all the logical elements
-sorted by the debug information internal offset; it includes its lexical
-level and debug info format.
+ llvm-debuginfo-analyzer --attribute=level
+ --select-regex --select-nocase --select=INTe
+ --report=list
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [003] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+ Logical View:
+ [000] {File} 'test-dwarf-gcc.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+
+The output shows that both objects contain the same elements. But the
+**'typedef INTEGER'** is located at different scope level. The GCC
+generated object, shows **'4'**, which is the correct value.
+
+There are 2 comparison methods: logical view and logical elements.
+
+LOGICAL VIEW
+""""""""""""
+It compares the logical view as a whole unit; for a match, each compared
+logical element must have the same parents and children.
+
+The output shows in view form the **missing (-), added (+)** elements,
+giving more context by swapping the reference and target object files.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=scopes,symbols,types,lines,instructions
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=view
+ --print=symbols,types
+ test-clang.o test-dwarf-gcc.o
-or
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ Logical View:
+ [000] {File} 'test-clang.o'
+
+ [001] {CompileUnit} 'test.cpp'
+ [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ [002] 2 {Function} extern not_inlined 'foo' -> 'int'
+ [003] {Block}
+ [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+ [003] 2 {Parameter} 'ParamBool' -> 'bool'
+ [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
+ [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+The output shows the merging view path (reference and target) with the
+missing and added elements.
+
+LOGICAL ELEMENTS
+""""""""""""""""
+It compares individual logical elements without considering if their
+parents are the same. For both comparison methods, the equal criteria
+includes the name, source code location, type, lexical scope level.
.. code-block:: none
- llvm-debuginfo-analyzer --attribute=level,format
- --output-sort=offset
- --print=elements
- test-clang.ll
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-clang.o test-dwarf-gcc.o
-Each row represents an element that is present within the debug
-information. The first column represents the scope level, followed by
-the associated line number (if any), and finally the description of
-the element.
+ Reference: 'test-clang.o'
+ Target: 'test-dwarf-gcc.o'
+
+ (1) Missing Types:
+ -[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+Changing the *Reference* and *Target* order:
.. code-block:: none
- Logical View:
- [000] {File} 'test-clang.ll' -> Textual IR
+ llvm-debuginfo-analyzer --attribute=level
+ --compare=types
+ --report=list
+ --print=symbols,types,summary
+ test-dwarf-gcc.o test-clang.o
- [001] {CompileUnit} 'test.cpp'
- [002] 2 {Function} extern not_inlined 'foo' -> 'int'
- [003] {Block}
- [004] 5 {Variable} 'CONSTANT' -> 'const INTEGER'
- [004] 5 {Line}
- [004] {Code} 'store i32 7, ptr %CONSTANT, align 4, !dbg !32'
- [004] 6 {Line}
- [004] {Code} 'store i32 7, ptr %retval, align 4, !dbg !33'
- [004] 6 {Line}
- [004] {Code} 'br label %return, !dbg !33'
- [003] 2 {Parameter} 'ParamPtr' -> 'INTPTR'
- [003] 2 {Parameter} 'ParamUnsigned' -> 'unsigned int'
- [003] 2 {Parameter} 'ParamBool' -> 'bool'
- [003] 4 {TypeAlias} 'INTEGER' -> 'int'
- [003] 2 {Line}
- [003] {Code} '%retval = alloca i32, align 4'
- [003] {Code} '%ParamPtr.addr = alloca ptr, align 8'
- [003] {Code} '%ParamUnsigned.addr = alloca i32, align 4'
- [003] {Code} '%ParamBool.addr = alloca i8, align 1'
- [003] {Code} '%CONSTANT = alloca i32, align 4'
- [003] {Code} 'store ptr %ParamPtr, ptr %ParamPtr.addr, align 8'
- [003] {Code} 'store i32 %ParamUnsigned, ptr %ParamUnsigned.addr, align 4'
- [003] {Code} '%storedv = zext i1 %ParamBool to i8'
- [003] {Code} 'store i8 %storedv, ptr %ParamBool.addr, align 1'
- [003] 8 {Line}
- [003] {Code} '%1 = load i32, ptr %ParamUnsigned.addr, align 4, !dbg !34'
- [003] 8 {Line}
- [003] {Code} 'store i32 %1, ptr %retval, align 4, !dbg !35'
- [003] 8 {Line}
- [003] {Code} 'br label %return, !dbg !35'
- [003] 9 {Line}
- [003] {Code} '%2 = load i32, ptr %retval, align 4, !dbg !36'
- [003] 9 {Line}
- [003] {Code} 'ret i32 %2, !dbg !36'
- [003] 3 {Line}
- [003] 3 {Line}
- [003] 3 {Line}
- [003] {Code} 'br i1 %loadedv, label %if.then, label %if.end, !dbg !26'
- [002] 1 {TypeAlias} 'INTPTR' -> '* const int'
+ Reference: 'test-dwarf-gcc.o'
+ Target: 'test-clang.o'
+
+ (1) Missing Types:
+ -[004] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ (1) Added Types:
+ +[003] 4 {TypeAlias} 'INTEGER' -> 'int'
+
+ ----------------------------------------
+ Element Expected Missing Added
+ ----------------------------------------
+ Scopes 4 0 0
+ Symbols 0 0 0
+ Types 2 1 1
+ Lines 0 0 0
+ ----------------------------------------
+ Total 6 1 1
+
+As the *Reference* and *Target* are switched, the *Added Types* from
+the first case now are listed as *Missing Types*.
EXIT STATUS
-----------
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
index 793a66e40b02b..34bace886a15f 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVElement.h
@@ -374,13 +374,6 @@ class LLVM_ABI LVElement : public LVObject {
// Report the current element as missing or added during comparison.
virtual void report(LVComparePass Pass) {}
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
-
static LVElementDispatch &getDispatch() { return Dispatch; }
};
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
index 6bf7f9d2105f8..090af54cd1b85 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVLocation.h
@@ -159,13 +159,6 @@ class LLVM_ABI LVLocation : public LVObject {
void print(raw_ostream &OS, bool Full = true) const override;
void printExtra(raw_ostream &OS, bool Full = true) const override;
-
- // Print the basic and extra information. Used mainly to debug IR.
- void printCommon(raw_ostream &OS, bool Full = true) const;
-
-#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
- void dumpCommon() const { printCommon(dbgs(), /*Full=*/true); }
-#endif
};
class LLVM_ABI LVLocationSymbol final : public LVLocation {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
index 774318cb3c53e..371bffb2ed163 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVReader.h
@@ -193,9 +193,6 @@ class LLVM_ABI LVReader {
virtual Error printMatchedElements(bool UseMatchedElements);
virtual void sortScopes() {}
- void printCollectedElements(LVScope *Root);
- bool checkIntegrityScopesTree(LVScope *Root);
-
public:
LVReader() = delete;
LVReader(StringRef InputFilename, StringRef FileFormatName, ScopedPrinter &W,
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
index 756bb18aeff12..eec5df19ff843 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Core/LVSupport.h
@@ -119,20 +119,7 @@ template <typename T> class LVProperties {
#define KIND_3(ENUM, FIELD, F1, F2, F3) \
BOOL_BIT_3(Kinds, ENUM, FIELD, F1, F2, F3)
-static constexpr int DEC_WIDTH = 8;
-inline FormattedNumber decValue(uint64_t N, unsigned Width = DEC_WIDTH) {
- return format_decimal(N, Width);
-}
-
-// Output the decimal representation of 'Value'.
-inline std::string decString(uint64_t Value, size_t Width = DEC_WIDTH) {
- std::string String;
- raw_string_ostream Stream(String);
- Stream << decValue(Value, Width);
- return String;
-}
-
-static constexpr int HEX_WIDTH = 12;
+const int HEX_WIDTH = 12;
inline FormattedNumber hexValue(uint64_t N, unsigned Width = HEX_WIDTH,
bool Upper = false) {
return format_hex(N, Width, Upper);
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
index 3336c9415927c..f6dc65f39c7ac 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/LVReaderHandler.h
@@ -17,7 +17,6 @@
#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
#include "llvm/DebugInfo/PDB/Native/PDBFile.h"
#include "llvm/Object/Archive.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/MachOUniversal.h"
#include "llvm/Object/ObjectFile.h"
#include "llvm/Support/Compiler.h"
@@ -31,9 +30,7 @@ namespace logicalview {
using LVReaders = std::vector<std::unique_ptr<LVReader>>;
using ArgVector = std::vector<std::string>;
-using InputHandle =
- PointerUnion<object::ObjectFile *, pdb::PDBFile *, object::IRObjectFile *,
- MemoryBufferRef *, StringRef *>;
+using PdbOrObj = PointerUnion<object::ObjectFile *, pdb::PDBFile *>;
// This class performs the following tasks:
// - Creates a logical reader for every binary file in the command line,
@@ -64,10 +61,8 @@ class LVReaderHandler {
object::Binary &Binary);
Error handleObject(LVReaders &Readers, StringRef Filename, StringRef Buffer,
StringRef ExePath);
- Error handleObject(LVReaders &Readers, StringRef Filename,
- MemoryBufferRef Buffer);
- Error createReader(StringRef Filename, LVReaders &Readers, InputHandle &Input,
+ Error createReader(StringRef Filename, LVReaders &Readers, PdbOrObj &Input,
StringRef FileFormatName, StringRef ExePath = {});
public:
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
index f5590ad40c993..64389902ea6fd 100644
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
+++ b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVBinaryReader.h
@@ -26,7 +26,6 @@
#include "llvm/MC/MCTargetOptions.h"
#include "llvm/MC/TargetRegistry.h"
#include "llvm/Object/COFF.h"
-#include "llvm/Object/IRObjectFile.h"
#include "llvm/Object/ObjectFile.h"
namespace llvm {
diff --git a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h b/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
deleted file mode 100644
index bb5fe7c7a4076..0000000000000
--- a/llvm/include/llvm/DebugInfo/LogicalView/Readers/LVIRReader.h
+++ /dev/null
@@ -1,302 +0,0 @@
-//===-- LVIRReader.h --------------------------------------------*- C++ -*-===//
-//
-// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
-// See https://llvm.org/LICENSE.txt for license information.
-// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
-//
-//===----------------------------------------------------------------------===//
-//
-// This file defines the LVIRReader class, which is used to describe a
-// LLVM IR reader.
-//
-//===----------------------------------------------------------------------===//
-
-#ifndef LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-#define LLVM_DEBUGINFO_LOGICALVIEW_READERS_LVIRREADER_H
-
-#include "llvm/DebugInfo/LogicalView/Core/LVReader.h"
-#include "llvm/Transforms/Utils/DebugSSAUpdater.h"
-
-namespace llvm {
-class DIFile;
-class DINode;
-class DILocation;
-class DIScope;
-class DISubprogram;
-class DIVariable;
-class BasicBlock;
-class Module;
-
-namespace object {
-class IRObjectFile;
-}
-
-namespace logicalview {
-
-class LVElement;
-class LVLine;
-class LVScopeCompileUnit;
-class LVSymbol;
-class LVType;
-struct LVSourceLanguage;
-
-class LVIRReader final : public LVReader {
- PointerUnion<object::IRObjectFile *, MemoryBufferRef *> InputFile;
-
- // Used by the metadata 'dump' functions, so the metadata nodes will be
- // numbered canonically; otherwise, pointer addresses are substituted.
- Module *TheModule = nullptr;
-
- // Symbols with locations for current compile unit.
- LVSymbols SymbolsWithLocations;
-
- const DICompileUnit *CUNode = nullptr;
-
- // The Dwarf version (from the module flags).
- unsigned DwarfVersion = 0;
-
- // Location index for global variables.
- uint64_t PoolAddressIndex = 0;
-
- // Default lower bound for arrays.
- int64_t DefaultLowerBound = 0;
-
- // Whether to emit all linkage names, or just abstract subprograms.
- bool UseAllLinkageNames = true;
-
- SSAValueNameMap ValueNameMap;
- DenseMap<void *, uint64_t> InstrLineAddrMap;
- std::unique_ptr<DbgValueRangeTable> DbgValueRanges;
-
- // Record the last assigned file index for each compile unit.
- // This data structure is to aid mapping DIFiles onto a DWARF-like file table.
- using LVIndexFiles = std::unordered_map<LVScopeCompileUnit *, size_t>;
- LVIndexFiles IndexFiles;
-
- // Store a FileID number for each DIFile seen.
- using LVCompileUnitFiles = std::unordered_map<const DIFile *, size_t>;
- LVCompileUnitFiles CompileUnitFiles;
-
- // Associate the metadata objects to logical elements.
- using LVMDObjects = std::unordered_map<const MDNode *, LVElement *>;
- LVMDObjects MDObjects;
-
- // An anonymous type for index type.
- LVType *NodeIndexType = nullptr;
-
- // Looking at IR generated with the '-gdwarf -gsplit-dwarf=split' the only
- // difference is setting the 'DICompileUnit::splitDebugFilename' to the
- // name of the split filename: "xxx.dwo".
- bool includeMinimalInlineScopes() const;
- bool useAllLinkageNames() const { return UseAllLinkageNames; }
-
- int64_t getDefaultLowerBound() const { return DefaultLowerBound; }
- void setDefaultLowerBound(LVSourceLanguage *SL);
-
- // We assume a constant instruction-size increase between instructions.
- static constexpr unsigned OFFSET_INCREASE = 4;
- void updateLineOffset() { CurrentOffset += OFFSET_INCREASE; }
-
- void updateFileIndex(LVScopeCompileUnit *CompileUnit, size_t FileIndex) {
- auto [Iter, Inserted] = IndexFiles.try_emplace(CompileUnit, FileIndex);
- if (!Inserted)
- Iter->second = FileIndex;
- }
-
- // Get the current assigned index file for the given compile unit.
- size_t getFileIndex(LVScopeCompileUnit *CompileUnit) {
- LVIndexFiles::iterator Iter = IndexFiles.find(CompileUnit);
- return Iter != IndexFiles.end() ? Iter->second : 0;
- }
-
- // For the given 'DIFile', generate a 1-based index to indicate the
- // source file where the logical element is declared.
- // The IR reader expects the indexes to be 1-based.
- // Each compile unit, keeps track of the last assigned index.
- size_t getOrCreateSourceID(const DIFile *File);
-
- void addMD(const MDNode *MD, LVElement *Element) {
- MDObjects.try_emplace(MD, Element);
- }
- LVElement *getElementForSeenMD(const MDNode *MD) const {
- LVMDObjects::const_iterator Iter = MDObjects.find(MD);
- return Iter != MDObjects.end() ? Iter->second : nullptr;
- }
- LVScope *getScopeForSeenMD(const MDNode *MD) const {
- return static_cast<LVScope *>(getElementForSeenMD(MD));
- }
- LVSymbol *getSymbo...
[truncated]
|
llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands #135440, which was reverted in #199890. It includes the fixes for the buildbots problems.
…(#200603) llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm/llvm-project#135440, which was reverted in llvm/llvm-project#199890. It includes the fixes for the buildbots problems.
…(#200603) llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm/llvm-project#135440, which was reverted in llvm/llvm-project#199890. It includes the fixes for the buildbots problems.
llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm#135440, which was reverted in llvm#199890. It includes the fixes for the buildbots problems.
llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands #135440, which was: reverted in: #199890 relanded in: #200603 reverted in: #201019 It includes the fixes for the buildbots problems.
…(#202120) llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm/llvm-project#135440, which was: reverted in: llvm/llvm-project#199890 relanded in: llvm/llvm-project#200603 reverted in: llvm/llvm-project#201019 It includes the fixes for the buildbots problems.
…(#202120) llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm/llvm-project#135440, which was: reverted in: llvm/llvm-project#199890 relanded in: llvm/llvm-project#200603 reverted in: llvm/llvm-project#201019 It includes the fixes for the buildbots problems.
…(#202120) llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm/llvm-project#135440, which was: reverted in: llvm/llvm-project#199890 relanded in: llvm/llvm-project#200603 reverted in: llvm/llvm-project#201019 It includes the fixes for the buildbots problems.
llvm-debuginfo-analyzer is a command line tool that processes debug info contained in a binary file and produces a debug information format agnostic “Logical View”, which is a high-level semantic representation of the debug info, independent of the low-level format. Add support for the LLVM IR format and be able to generate logical views. Both textual representation (.ll) and bitcode (.bc) formats are supported. This relands llvm#135440, which was: reverted in: llvm#199890 relanded in: llvm#200603 reverted in: llvm#201019 It includes the fixes for the buildbots problems.
This reverts commit 6bbbf74.
There are link issues with some buildbots.